import pygame
from pygame.sprite import Sprite

class Ship(Sprite):
    """管理飞船的类"""

    def __init__(self, ai_game) -> None: # ai_game是AlienInvasion类
        """初始化飞船并设置其初始位置"""
        super().__init__()
        self.screen = ai_game.screen # 根据传入的AlienInvasion对象确定屏幕的属性
        self.screen_rect = ai_game.screen.get_rect() # get_rect()返回屏幕的属性对象（如位置、大小等）（图片被当作一个矩形）

        self.settings = ai_game.settings

        # 加载飞船图像并获取其外接矩形
        self.image = pygame.image.load('images/ship.bmp') # image.load()返回image接口对象（surface），包含各种属性
        self.rect = self.image.get_rect() # get_rect()返回图片的属性对象（图片被当作一个矩形）

        # 对于每艘新飞船，都将其放在屏幕底部的中央 初始化位置
        self.rect.midbottom = self.screen_rect.midbottom # bottom底部 midbottom底部中间 midleft底部左边
        
        # 移动标志
        self.moving_right = False # 向右移动标志
        self.moving_left = False # 向左移动标志

        # 在飞船的属性rect.x中存储小数值（默认是存储整数） 原理：另外存储一个浮点数用来存储坐标值x，在更新的最后再把这个浮点数赋值给rect.x
        self.x = float(self.rect.x)

    def update(self):
        if self.moving_right and self.rect.right < self.screen_rect.right: # 通过限制self.rect.right，self.rect.left限制左右移动的范围不超过屏幕
            self.x += self.settings.ship_speed # 更新对象的x值而不是rect.x值
        if self.moving_left and self.rect.left > self.screen_rect.left: # 不能用elif，因为如果用elif会使右移处于优先地位，导致左右键同时按下时会跳过左移，只向右移
            self.x -= self.settings.ship_speed

        # 根据最后计算出的更新的x值更新rect.x（不会把rect.x变成float类型）
        self.rect.x = self.x # 虽然不会将rect.x变成浮点型，但self.x会按照self.speed的速度变化，所以self.rect.x的变化速度和self.x一样
        # print(self.rect.x)

    def blitme(self):
        # 在指定位置绘制飞船
        self.screen.blit(self.image, self.rect) # blit位块传输
        # print(self.rect)
        # (source: Surface, dest: _Coordinate | _CanBeRect, area: _CanBeRect | None = ..., special_flags: int = ...) -> Rect
        # 输入surface对象，rect对象（位置信息）
        # Rect是pygame中的一个创建矩形的对象，它包含一些属性主要是两块：坐标和长宽。rect(570, 752, 60, 48)前2个是坐标，后2个是宽高
    
    def center_ship(self):
        # 复原ship位置到底部中间
        self.rect.midbottom = self.screen_rect.midbottom
        self.x = float(self.rect.x)
    